12 权限系统

请求权限

代码中包含这样的代码:

1
mWebView.loadUrl("https://xianxiaotao.github.io/");

我们需要为它请求网络权限,在AndroidMainfest.xml文件中添加以下权限:

1
<uses-permission android:name="android.permission.INTERNET"/>

为代码添加权限检查

在AndroidMainfest.xml文件中声明一个自定义权限:

1
<permission android:name="com.xianxiaotao.checkpermission.permission.DO_SOMETHING" />

当我们需要在代码中为应用添加权限检查功能时,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class CheckPermission {
public static final String PERMISSION_DO_SOMETHING = "com.xianxiaotao.checkpermission.permission.DO_SOMETHING";
public static void doSomething(Context context) {
int checkResult = context.checkCallingOrSelfPermission(PERMISSION_DO_SOMETHING);
if (checkResult != PackageManager.PERMISSION_GRANTED) {
throw new SecurityException("doSomething need permission: " + PERMISSION_DO_SOMETHING);
}
System.out.println("If allowed, do something!");
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CheckPermission.doSomething(this);
}
}

此时运行程序,发生SecurityException。为此,我们需要添加权限:

1
<uses-permission android:name="com.xianxiaotao.checkpermission.permission.DO_SOMETHING"/>

为基本组件添加权限检查

这种自定义的权限通常是为其他应用访问本应用所设的限制。例如在AndroidMainfest.xml文件中声明一个自定义权限:

1
<permission android:name="com.xianxiaotao.music.permission.PLAY_MUSIC" />

然后为PlayMusicActivity添加权限检查:

1
2
3
4
5
6
7
8
<activity
android:name=".activity.PlayMusicActivity"
android:permission="com.xianxiaotao.music.permission.PLAY_MUSIC">
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="com.xianxiaotao.music.intent.action.PLAY_MUSIC"/>
</intent-filter>
</activity>

应用内部执行下列语句,则不需要做额外工作,在同一个应用内,对于四大组件来说默认拥有访问权限。

1
startActivity(new Intent(MainActivity.this, PlayMusicActivity.class));

但是对于其他应用,如果:

1
startActivity(new Intent("com.xianxiaotao.music.permission.PLAY_MUSIC"));

就需要添加权限才能访问PlayMusicActivity:

1
<uses-permission android:name="com.xianxiaotao.music.permission.PLAY_MUSIC"/>